#include "ManejadorLista.h"

using namespace Manejadores;

ManejadorLista::ManejadorLista() {
	Configuracion* config = config->getInstancia();
	string pathDeDatos = config->getNombreArchivoLista();
	this->listas = new ArchivoDeEstructurasVariables(pathDeDatos);
	this->indicePorUnicidad = new HashExtensible("IndicePorUnicidadLista");
	this->indicePorEleccion = new ArbolBMas("IndiceListaPorEleccion");
}

bool ManejadorLista::alta(Lista* lista) {
	string claveFecha = Utils::convertirEnteroAString(lista->getEleccion()->getFecha());
	string claveCargo = lista->getEleccion()->getCargo()->getNombre();
	string claveNombre = lista->getNombre();
	string clavePorUnicidad = claveFecha+claveCargo+claveNombre;
	if (!indicePorUnicidad->existe(clavePorUnicidad)) {
		unsigned int posicionDelRegistro = listas->insertar(lista);
		indicePorUnicidad->insertar(clavePorUnicidad, posicionDelRegistro);
		string clavePorEleccion = claveFecha+claveCargo;
		indicePorEleccion->insertar(clavePorEleccion, posicionDelRegistro);
		return true;
	} else
		return false;

}

bool ManejadorLista::baja(Lista* lista){
	string claveFecha = Utils::convertirEnteroAString(lista->getEleccion()->getFecha());
	string claveCargo = lista->getEleccion()->getCargo()->getNombre();
	string claveNombre = lista->getNombre();
	string clavePorUnicidad = claveFecha+claveCargo+claveNombre;
	IRegistroIndice* aBorrar = indicePorUnicidad->buscar(clavePorUnicidad);
	unsigned int posicionDelRegistro = listas->insertar(lista);
	if (aBorrar->getOffsets()->size() > 0) {
		listas->borrar(lista, aBorrar->getOffsets()->at(0));
		indicePorUnicidad->eliminar(clavePorUnicidad,
				aBorrar->getOffsets()->at(0));
		string clavePorEleccion = claveFecha + claveCargo;
		indicePorEleccion->suprimir(clavePorEleccion, posicionDelRegistro);
		return true;
	} else
		return false;
}

bool ManejadorLista::modificacion(Lista* lista){

	string claveFecha = Utils::convertirEnteroAString(lista->getEleccion()->getFecha());
	string claveCargo = lista->getEleccion()->getCargo()->getNombre();
	string claveNombre = lista->getNombre();
	string clavePorUnicidad = claveFecha+claveCargo+claveNombre;
	IRegistroIndice* viejaPosicion = indicePorUnicidad->buscar(lista->getNombre());
	string clavePorEleccion = claveFecha+claveCargo;
	IRegistroIndice* viejaPosicionEleccion ;// TODO:: Metodo buscar del arbol = indicePorEleccion->buscarRegistro(clavePorEleccion);
	unsigned int nuevaPosicion = listas->modificar(lista, viejaPosicion->getOffsets()->at(0));
	if (viejaPosicion->getOffsets()->at(0) != nuevaPosicion){
		indicePorUnicidad->modificar(lista->getNombre(),viejaPosicion->getOffsets()->at(0),nuevaPosicion);
		indicePorEleccion->modificar(clavePorEleccion,viejaPosicion->getOffsets()->at(0),nuevaPosicion);
		return true;
	}else
		return false;
}

Lista* ManejadorLista::recuperar(int fecha, string nombreCargo, string nombreLista){
	string claveFecha = Utils::convertirEnteroAString(fecha);
	string clavePorUnicidad = claveFecha+nombreCargo+nombreLista;
	IRegistroIndice* registro = this->indicePorUnicidad->buscar(clavePorUnicidad);
	if (registro->getOffsets()->size() > 0){
		Lista* lista = new Lista();
		this->listas->leer(lista, registro->getOffsets()->at(0));
		delete registro;
		return lista;
	}else{
		delete registro;
		return NULL;
	}
}

ManejadorLista::~ManejadorLista() {
	delete this->listas;
	delete this->indicePorUnicidad;
	delete this->indicePorEleccion;
}
